在python中,我们通常会遇到对矩阵或者数据框进行合并,这里我总结了一些numpy库和pandas库中合并数据的方法。
numpy中的数据合并
- 基础知识介绍
在介绍数据合并之前,先说明一下numpy中数组维数的一些需要注意的点:
- 数组[1,2,3,4]和数组[[1,2,3,4]]这两种是不一样的!前者是一维数组,它的shape是(4,);而后者是二维数组(通常我们可以当作矩阵),它的shape是(1,4),对应着矩阵1行四列。当然,两者之间是可以相互转化的,转化代码如下:
import numpy as np
a=np.array([1,2,3,4])
b=np.array([[1,2,3,4]])
A=a[np.newaxis,:] ##np.newaxis根据在行或列的方向上添加维度
B=b.ravel() ##ravel()函数可以将多维数组拉平称为一维数组
- 三维数组的理解
对于数组[[[1,2]],[3,4]]] ,它的shape是(2,1,2)。第一个维度代表:去掉最外层的括号后,里面共有矩阵的数目,也就是[[1,2]],[[3,4]]这两个矩阵;而第二、三维度对应着1行2列的矩阵维数
- 数据合并
首先,利用随机数创建两个随机数组,为了保证每次结果一样,并设置随机种子
import numpy as np
np.random.seed(4869) #设置随机种子
a=np.floor(10*np.random.random((2,3))) ##生成二行三列随机数(0~1之间)矩阵并向下取整
b=np.floor(np.random.normal(0,1,6)).reshape(2,3) ##生成标准正态分布的随机数矩阵
print('矩阵a:\n{}'.format(a))
print('-'*10)
print('矩阵b:\n{}'.format(b))
--------------输出结果如下----------------
矩阵a:
[[5. 7. 0.]
[2. 3. 8.]]
----------
矩阵b:
[[-2. -3. -3.]
[-2. 1. 1.]]
以下将介绍三种合并方法:
#方法一 stack函数
A=np.stack((a,b),axis=0) #axis控制横/纵向合并
B=np.stack((a,b),axis=1)
print('纵向合并:\n{}'.format(A))
print('数组A的维度:{}'.format(A.shape))
print('-'*10)
print('横向合并:\n{}'.format(B))
print('数组B的维度:{}'.format(B.shape))
-------------输出结果如下---------------
纵向合并:
[[[ 5. 7. 0.]
[ 2. 3. 8.]]
[[-2. -3. -3.]
[-2. 1. 1.]]]
数组A的维度:(2, 2, 3) ##直接在a矩阵的尾部新增矩阵b,组合成一个三维数组
----------
横向合并:
[[[ 5. 7. 0.]
[-2. -3. -3.]]
[[ 2. 3. 8.]
[-2. 1. 1.]]]
数组B的维度:(2, 2, 3) ##将原a,b矩阵对应行进行组合,组合一个三维数组
从上述结果来看,最终输出的是一个三维数组。如果我们仅仅是希望将两个矩阵进行横\纵向合并后还是矩阵,可以使用以下两个方法:
#方法二 vstack和hstack函数 (v和h分别代表vertical和horizontal)
A=np.vstack((a,b))
B=np.hstack((a,b))
print('纵向合并:\n{}'.format(A))
print('矩阵A的维度:{}'.format(A.shape))
print('-'*10)
print('横向合并:\n{}'.format(B))
print('矩阵B的维度:{}'.format(B.shape))
-------------输出结果如下-----------
纵向合并:
[[ 5. 7. 0.]
[ 2. 3. 8.]
[-2. -3. -3.]
[-2. 1. 1.]]
矩阵A的维度:(4, 3)
----------
横向合并:
[[ 5. 7. 0. -2. -3. -3.]
[ 2. 3. 8. -2. 1. 1.]]
矩阵B的维度:(2, 6)
#方法三 concatenate函数
A=np.concatenate((a,b),axis=0)
B=np.concatenate((a,b),axis=1)
print('纵向合并:\n{}'.format(A))
print('矩阵A的维度:{}'.format(A.shape))
print('-'*10)
print('横向合并:\n{}'.format(B))
print('矩阵B的维度:{}'.format(B.shape))
------------输出结果------------------
纵向合并:
[[ 5. 7. 0.]
[ 2. 3. 8.]
[-2. -3. -3.]
[-2. 1. 1.]]
矩阵A的维度:(4, 3)
----------
横向合并:
[[ 5. 7. 0. -2. -3. -3.]
[ 2. 3. 8. -2. 1. 1.]]
矩阵B的维度:(2, 6)
#总结:方法二和方法三的效果是一样的。方法二的vstack对应着方法三的axis=0,hstack对应着axis=1
pandas中的数据合并
pandas中数据合并的方法有很多,例如concat,join,merge,append等函数,这里主要介绍常用的concat函数和append函数。
#1.创建两个数据集data1,data2
import pandas as pd
import numpy as np
np.random.seed(4869)
data1=pd.DataFrame(np.arange(6).reshape(2,3),columns=['A','B','C'])
data2=pd.DataFrame(np.ceil(10*np.random.random((2,3))),columns=['A','B','C']) ##向上取整
print('数据集data1:\n{}'.format(data1))
print('-'*10)
print('数据集data2:\n{}'.format(data2))
-----------输出结果如下----------------
数据集data1:
A B C
0 0 1 2
1 3 4 5
----------
数据集data2:
A B C
0 6.0 8.0 1.0
1 3.0 4.0 9.0
#2.concat函数
data_v=pd.concat([data1,data2],axis=0)
data_h=pd.concat([data1,data2],axis=1)
print('纵向合并:\n{}'.format(data_v)) ##注意:纵向合并的时候需要保持两个数据集的列名相同
print('-'*10)
print('横向合并:\n{}'.format(data_h))
----------输出结果如下---------------
纵向合并:
A B C
0 0.0 1.0 2.0
1 3.0 4.0 5.0
0 6.0 8.0 1.0
1 3.0 4.0 9.0
----------
横向合并:
A B C A B C
0 0 1 2 6.0 8.0 1.0
1 3 4 5 3.0 4.0 9.0
#!纵向合并的时候,前面的索引是保留了原数据集的索引.如果想让其重新排列,可设置ignore_index=True
data_v=pd.concat([data1,data2],axis=0,ignore_index=True)
print('纵向合并:\n{}'.format(data_v))
-----------输出结果如下-------------
纵向合并:
A B C
0 0.0 1.0 2.0
1 3.0 4.0 5.0
2 6.0 8.0 1.0
3 3.0 4.0 9.0
#3.append函数(类似列表中的添加功能,直接在数据框的下方进行添加)
df=data2.append(data1,ignore_index=True)
print('append纵向合并:\n{}'.format(df))
-----------输出结果如下----------------
append纵向合并:
A B C
0 6.0 8.0 1.0
1 3.0 4.0 9.0
2 0.0 1.0 2.0
3 3.0 4.0 5.0
以上就是目前我学习到的数据合并的全部内容,随着学习深入,我会慢慢再来补充的。